package ucla.axelia.vista;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import ucla.axelia.controlador.interfaces.IServicioAdministracionReconocimiento;
import ucla.axelia.modelo.data.Reconocimiento;
import ucla.axelia.modelo.data.ReconocimientoRequerido;
import ucla.axelia.modelo.data.TipoActividad;
import ucla.axelia.modelo.data.TipoActividadRequerida;
import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.layout.GridLayoutData;

import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.DobleLista;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;

class PanePrerrequisitoReconocimiento extends ContentPane implements ComponenteDatosListener{ 

	private DobleLista dblReconocimientosRequeridos;
	private List<Reconocimiento> listaReconocimientosOrigen;
	private List<Reconocimiento> listaReconocimientosDestino;
	private DobleLista dblTipoActividadesRequeridas;
	private List<TipoActividad> listaTiposDeActividadesOrigen;
	private List<TipoActividad> listaTiposDeActividadesDestino;
	
	private IServicioAdministracionReconocimiento servicioAdministracionReconocimiento;
	private Reconocimiento reconocimiento;
	
	public void initComponents(){
		this.removeAll();
		this.setEnabled(true);
		Grid grid = new Grid();
		grid.setStyleName("Obelisco.GridPaneDialogo");
		grid.setSize(4); //Numero de columnas de la tabla
		grid.setColumnWidth(0, new Extent(150, Extent.PX)); //PX denota pixeles
		
		GridLayoutData gridLayout1por4Titulo = new  GridLayoutData();
		gridLayout1por4Titulo.setBackground(new Color(255,241,171));
		gridLayout1por4Titulo.setAlignment( new Alignment(Alignment.CENTER, Alignment.CENTER));
		gridLayout1por4Titulo.setColumnSpan(4);
		
		GridLayoutData gridLayout1por4 = new  GridLayoutData();
		gridLayout1por4.setAlignment( new Alignment(Alignment.CENTER, Alignment.CENTER));
		gridLayout1por4.setColumnSpan(4);
		
		Label lblReconocimientosRequeridos = new Label ("Reconocimientos Requeridos (Prerequisitos)");
		lblReconocimientosRequeridos.setLayoutData(gridLayout1por4Titulo);
		grid.add(lblReconocimientosRequeridos);
		
		dblReconocimientosRequeridos = new DobleLista();
		dblReconocimientosRequeridos.setLabelOrigen("Reconocimientos existentes");
		dblReconocimientosRequeridos.setLabelDestino("Reconocimientos necesarios");
		dblReconocimientosRequeridos.setLayoutData(gridLayout1por4);
		grid.add(dblReconocimientosRequeridos);
		
		Label lblTipoActividadRequerida = new Label ("Tipos de Actividades Requeridos (Prerequisitos)");
		lblTipoActividadRequerida.setLayoutData(gridLayout1por4Titulo);
		grid.add(lblTipoActividadRequerida);
		
		dblTipoActividadesRequeridas= new DobleLista();
		dblTipoActividadesRequeridas.setLabelOrigen("Tipo de Actividades existentes");
		dblTipoActividadesRequeridas.setLabelDestino("Tipo de Actividades necesarias");
		dblTipoActividadesRequeridas.setLayoutData(gridLayout1por4);
		grid.add(dblTipoActividadesRequeridas);
		
		Column columna = new Column(); // se crea la columna
		columna.add(grid); // se le agrega el grid
		
		this.add(columna);
	}


	public void onCancelar() {
		
	}
	
	public void onConfirmarCambios(Object arg0, TipoFuncion arg1, String arg2) {
		List<Reconocimiento> listaReconocimientos = (List<Reconocimiento>) dblReconocimientosRequeridos.getDatosDestino();
		Set<ReconocimientoRequerido> reconocimientosRequeridos = new HashSet<ReconocimientoRequerido>();
		for (Reconocimiento reconocimiento : listaReconocimientos){
			ReconocimientoRequerido reconocimientoRequerido = new ReconocimientoRequerido();
			reconocimientoRequerido.setReconocimientoByIdReconocimientoRequisito(reconocimiento);
			reconocimientosRequeridos.add(reconocimientoRequerido);
		}
		this.reconocimiento.setReconocimientoRequeridosForIdReconocimiento(reconocimientosRequeridos);
		
		List<TipoActividad> listaTipoactividades = (List<TipoActividad>)dblTipoActividadesRequeridas.getDatosDestino();
		Set<TipoActividadRequerida> tiposActividadesRequeridas = new HashSet<TipoActividadRequerida>();
		for (TipoActividad tipoActividad : listaTipoactividades){
			TipoActividadRequerida tipoActividadRequerida = new TipoActividadRequerida();
			tipoActividadRequerida.setTipoActividad(tipoActividad);
			tipoActividadRequerida.setReconocimiento(reconocimiento);
			tiposActividadesRequeridas.add(tipoActividadRequerida);
		}
		this.reconocimiento.setTipoActividadRequeridas(tiposActividadesRequeridas);
		servicioAdministracionReconocimiento.guardarReconocimiento(reconocimiento);
	}
	
	private void cargarDobleListaTipoActividadConFiltro () {
		List<TipoActividad> listaTipoactividadRequerida = new ArrayList<TipoActividad>();
		for (TipoActividadRequerida tipoActividadRequerida : reconocimiento.getTipoActividadRequeridas())
			listaTipoactividadRequerida.add(tipoActividadRequerida.getTipoActividad());
		dblTipoActividadesRequeridas.setDatosDestino(listaTipoactividadRequerida);
		
		List<TipoActividad> listaTipoActividad = servicioAdministracionReconocimiento.buscarTipoActividades();
		List<TipoActividad> listaTipoActividadOrigen = new ArrayList<TipoActividad>();
		for (TipoActividad tipoActividad : listaTipoActividad) {
			boolean encontrado = false;
			for (TipoActividad tipoactividadRequerida : listaTipoactividadRequerida)
				if (tipoactividadRequerida.equals(tipoActividad)) {
					encontrado = true;
					break;
				}
			if (!encontrado)
				listaTipoActividadOrigen.add(tipoActividad);
		}
		dblTipoActividadesRequeridas.setDatosOrigen(listaTipoActividadOrigen);	
	}
	
	private void cargarDobleListaReconocimientosConFiltro () {
		List<Reconocimiento> listaReconocimientosRequeridos = new ArrayList<Reconocimiento>();
		for (ReconocimientoRequerido reconocimientoRequerido : reconocimiento.getReconocimientoRequeridosForIdReconocimiento())
			listaReconocimientosRequeridos.add(reconocimientoRequerido.getReconocimientoByIdReconocimientoRequisito());
		dblReconocimientosRequeridos.setDatosDestino(listaReconocimientosRequeridos);
		
		List<Reconocimiento> listaReconocimiento = servicioAdministracionReconocimiento.buscarReconocimientos();
		List<Reconocimiento> listaReconocimientosOrigen = new ArrayList<Reconocimiento>();
		for (Reconocimiento reconocimiento : listaReconocimiento) {
			boolean encontrado = false;
			for (Reconocimiento reconocimientoRequerido : listaReconocimientosRequeridos)
				if (reconocimientoRequerido.equals(reconocimiento)) {
					encontrado = true;
					break;
				}
			if (!encontrado && !reconocimiento.equals(this.reconocimiento)) 
				listaReconocimientosOrigen.add(reconocimiento);
		}
		dblReconocimientosRequeridos.setDatosOrigen(listaReconocimientosOrigen);
	}
	
	public void onConfirmarEliminacion(Object arg0) {
	}
	
	public void onConsultar(Object arg0) {
		cargarDobleListaTipoActividadConFiltro();
		cargarDobleListaReconocimientosConFiltro();
		setEnabled(false);
	}
	
	public void onCrear() {
	}
	
	public void onFuncionPersonalizada(Object arg0, TipoFuncion arg1, String arg2) {
	}
	
	public void onIncluir(Object arg0) {
		listaReconocimientosOrigen = servicioAdministracionReconocimiento.buscarReconocimientos();
		listaReconocimientosDestino = new ArrayList<Reconocimiento>();
		dblReconocimientosRequeridos.setDatosOrigen(listaReconocimientosOrigen);
		dblReconocimientosRequeridos.setDatosDestino(listaReconocimientosDestino);
		
		listaTiposDeActividadesOrigen = servicioAdministracionReconocimiento.buscarTipoActividades();
		listaTiposDeActividadesDestino = new ArrayList<TipoActividad>();
		dblTipoActividadesRequeridas.setDatosOrigen(listaTiposDeActividadesOrigen);
		dblTipoActividadesRequeridas.setDatosDestino(listaTiposDeActividadesDestino);
	}
	
	public void onInicializar() {
		this.initComponents();
	}
	
	public void onModificar(Object arg0) {
		cargarDobleListaTipoActividadConFiltro();
		cargarDobleListaReconocimientosConFiltro();
	}
	
	public void onObjetoEntidad(Object arg0) {
		this.reconocimiento = (Reconocimiento) arg0;
	}
	
	public boolean onValidarDatos(Object arg0, TipoFuncion arg1, String arg2) {
		return true;
	}

	public IServicioAdministracionReconocimiento getServicioAdministracionReconocimiento() {
		return servicioAdministracionReconocimiento;
	}

	public void setServicioAdministracionReconocimiento(
			IServicioAdministracionReconocimiento servicioAdministracionReconocimiento) {
		this.servicioAdministracionReconocimiento = servicioAdministracionReconocimiento;
	}

	public void onListaParametros(List listaParametros) {
	}
}
